package ru.spb.nicetu.altx.mnemo.math.managers;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ICellEditorValidator;

public class CellEditClassManager {

  protected CellEditClassManager() {
  };

  // классы Editor-ов по ключу <имя Node-а, имя Ячейки>
  private Map<Pair<String, String>, Class< ? extends CellEditor>> cellEditorClassMap = new HashMap<Pair<String, String>, Class< ? extends CellEditor>>();

  // классы Validator-ов по ключу <имя Node-а, имя Ячейки>
  private Map<Pair<String, String>, ICellEditorValidator> cellValidatorMap = new HashMap<Pair<String, String>, ICellEditorValidator>();

  public static CellEditClassManager instance = null;

  public static CellEditClassManager getInstance() {
    if (instance == null)
      instance = new CellEditClassManager();
    return instance;
  }

  /**
   * Добавляет класс Editor-а в Менеджер по ключу <имя Node-а, имя Ячейки>
   */
  public void addCellEditorClassForNodeCell(
                                            String nodeName,
                                            String cellName,
                                            Class< ? extends CellEditor> editorClass) {
    Pair<String, String> key = new Pair<String, String>(nodeName, cellName);
    cellEditorClassMap.put(key, editorClass);
  }

  /**
   * Добавляет класс Validator-а в Менеджер по ключу <имя Node-а, имя Ячейки>
   */
  public void addCellValidatorForNodeCell(String nodeName, String cellName,
                                          ICellEditorValidator validator) {
    Pair<String, String> key = new Pair<String, String>(nodeName, cellName);
    cellValidatorMap.put(key, validator);
  }

  /**
   * @return класс CellEditor-а из Менеджера по ключу <имя Node-а, имя Ячейки>
   */
  public Class< ? extends CellEditor> getCellEditorClassForNodeCell(
                                                                    String nodeName,
                                                                    String cellName) {
    Pair<String, String> key = new Pair<String, String>(nodeName, cellName);
    return cellEditorClassMap.get(key);
  }

  /**
   * @return класс Validator-а из Менеджера по ключу <имя Node-а, имя Ячейки>
   */
  public ICellEditorValidator getCellValidatorForNodeCell(String nodeName,
                                                          String cellName) {
    Pair<String, String> key = new Pair<String, String>(nodeName, cellName);
    return cellValidatorMap.get(key);
  }

  protected class Pair<T1, T2> {
    private T1 v1;
    private T2 v2;

    public Pair(T1 v1, T2 v2) {
      this.v1 = v1;
      this.v2 = v2;
    }

    public T1 getV1() {
      return v1;
    }

    public T2 getV2() {
      return v2;
    }

    public void setV1(T1 v1) {
      this.v1 = v1;
    }

    public void setV2(T2 v2) {
      this.v2 = v2;
    }

    @SuppressWarnings("unchecked")
    
    public boolean equals(Object obj) {
      if (!(obj instanceof Pair))
        return false;

      Pair<T1, T2> point;
      try {
        point = (Pair<T1, T2>) obj;
      } catch (Exception e) {
        return false;
      }
      return v1.equals(point.v1) && v2.equals(point.v2);
    }

    
    public int hashCode() {
      return v1.hashCode() + 137 * v2.hashCode();
    }
  } // class Pair

}
